package cn.wolfcode.ws;

import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 通过springboot引入的依赖为 spring-boot-starter-websocket (但是下面那几个好像不需要?)
 *
 * @ServerEndpoint  类似 @RequestMapping , 但是与ws协议的连接进行 双端通信, 需要将该类交给spring容器管理
 */
@Getter@Setter
@ServerEndpoint("/{uuid}")
@Component
public class WebsocketServer {
    private Session session;
    /**
     * 维护 token: 客户端信息 的 map (客户端信息存在WebsocketServer.session中)
     */
    public static ConcurrentHashMap<String, WebsocketServer> websocketServerMap = new ConcurrentHashMap<>();

    /**
     * 依旧是四种监听器
     *      连接成功, 客户端发送消息, 连接关闭, 连接出现错误
     */

    /**
     * 连接成功
     * @param session           这俩参数都是自定义的, 只是贴了@OnOpen注解
     * @param token
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("uuid") String token) {
        this.session = session;
        websocketServerMap.put(token, this);
        System.out.println("连接成功");
    }

    // 本项目无需双向连接, 仅需要对客户端推送数据, 所以该方法可不写
    @OnMessage
    public void onMessage(String message) {
        System.out.println("收到消息:" + message);
    }

    @OnClose
    public void onClose() {
        System.out.println("连接关闭");
    }

    @OnError
    public void onError(Throwable error) {
        System.out.println("连接出现错误");
    }
}
